class Solution {//leetcode210——课程表2
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        //建邻接表和入度表
        unordered_map<int,vector<int>> edges;//邻接表
        unordered_map<int,int> in;//入度表
        //初始化入度表
        for(int i=0;i<numCourses;i++) in[i]=0;

        for(auto &vec:prerequisites){
            edges[vec[1]].push_back(vec[0]);
            in[vec[0]]++;
        }

        //开始拓扑排序
        queue<int> q;
        //1.遍历入度表，将所有入度为0的顶点加入队列中
        for(auto [x,y]:in){
            if(y==0) q.push(x);
        }
        //bfs
        vector<int> ret;
        while(q.size()){
            int t=q.front();
            q.pop();
            ret.push_back(t);
            for(auto dots:edges[t]){
                in[dots]--;
                if(in[dots]==0) q.push(dots);
            }
        }
        for(auto [x,y]:in){
            if(y>0) return vector<int>();
        }
        return ret;
    }
};